<?php
namespace daswork;

class Loader 
{
    // protected static $instance = [];
    // 类名映射
    // protected static $map = [];
    // 命名空间别名
    // protected static $namespaces = [];
    // 自动加载的文件
    // private static $autoloadFiles = [];
    // 命名空间与路径映射
    private static $namespaces = [];
    // 已加载过的class
    protected static $classMap = [];

    // 自动加载
    private static function autoload($class)
    {
        // 是否有加载过
        if (in_array($class, self::$classMap)) {
            return true;
        }

        if ($file = self::findFile($class)) {
            // Win环境严格区分大小写
            if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {
                return false;
            }
            __include_file($file);
            $classMap[] = $class;
            return true;
        }
    }
    
    public static function findFile($class)
    {
        // $namespace = \dirname($class); linux dirname 不能处理 '\' 用替换查找来解决
        $baseClass = strrchr($class, '\\');
        $namespace = str_replace($baseClass, '', $class);
        // 有命名空间映射的  
        if (isset(self::$namespaces[$namespace])) {
            $file = self::$namespaces[$namespace] . $baseClass . EXT;
            return str_replace('\\', '/', $file);
        }

        $model = substr($class,0,strpos($class, '\\'));
        // var_dump($model);
        if ($model=='app') {
            $file = APP_PATH . DS. str_replace('\\', DS, substr($class,strpos($class, '\\') + 1)) . EXT;
            // var_dump($file);
            return $file;
        }
    }

    // 注册系统自动加载
    public static function register($autoload = '')
    {
        spl_autoload_register($autoload ?: 'daswork\\Loader::autoload', true, true);
        self::$namespaces = [
            'daswork' => CORE_PATH,
            'daswork\db' => CORE_PATH . 'db' . DS
        ];
    }
}

/**
 * 作用范围隔离
 *
 * @param $file
 * @return mixed
 */
function __include_file($file)
{
    return include $file;
}

function __require_file($file)
{
    return require $file;
}

